package com.chub.study.modules.controller;

import com.chub.study.modules.entity.Book;
import org.junit.runner.RunWith;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @author : chub
 * @version : V1.0.0
 * @file name      : HelloWorldController
 * @describe : TODO
 * @created on     : 2021-08-25 13:17
 * @last modified  : 2021-08-25 13:17
 * @module purpose : TODO
 */
@RunWith(SpringRunner.class)
@RestController
public class HelloWorldController {
    private Logger logger = LoggerFactory.getLogger(getClass());

    // @Autowired(required = false)
    // private RedisTemplate<String, String> redisTemplate;
    //
    // @Autowired
    // private StringRedisTemplate stringRedisTemplate;

    // 这里注解将会将Book类的属性值注入到book对象中
    @Autowired
    // @Resource
    private Book book;
//    @RequestMapping(value = "hello", method= RequestMethod.GET )
    @GetMapping("/hello")
    public String index(@RequestParam(value = "name", required = false, defaultValue = "chub") String name) {
        logger.info("this is a test name = {}", name);

       // Book book = new Book();
        logger.info("name --> {}", book.getName());
        logger.info("author --> {}", book.getAuthor());
        logger.info("desc --> {}", book.getDesc());


        // 使用redis客户端，遍历所有的键的时候，发现键中有类似 \xac\xed\x00\x05t\x00 的乱码
        // 原因分析：
        // spring-data-redis 的 RedisTemplate<K, V>模板类 在操作redis时默认使用JdkSerializationRedisSerializer 来进行序列化。
        // spring操作redis是在jedis客户端基础上进行的，而jedis客户端与redis交互的时候协议中定义是用byte类型交互，
        // 看到spring-data-redis中RedisTemplate<K, V>在操作的时候k，v是泛型对象，而不是byte[]类型的，
        // 这样导致的一个问题就是，如果不对RedisTemplate进行设置，spring会默认采用defaultSerializer = new JdkSerializationRedisSerializer();
        // 这个方法来对key、value进行序列化操作，JdkSerializationRedisSerializer它使用的编码是ISO-8859-1
        // 解决办法一：在使用时，规定redisTemplate的类型
        // @Autowired
        // private RedisTemplate<String,String> redisTemplate

        // 解决办法二：添加 redis 配置类，配置使用的序列化方式
        // @Configuration
        // public class RedisConfig {
        //
        //     @Bean(name = "redisTemplate")
        //     public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory factory) {
        //         RedisTemplate<Object, Object> template = new RedisTemplate<>();
        //         RedisSerializer<String> redisSerializer = new StringRedisSerializer();
        //
        //         template.setConnectionFactory(factory);
        //         //key序列化方式
        //         template.setKeySerializer(redisSerializer);
        //         //value序列化
        //         template.setValueSerializer(redisSerializer);
        //         //value hashmap序列化
        //         template.setHashValueSerializer(redisSerializer);
        //         //key haspmap序列化
        //         template.setHashKeySerializer(redisSerializer);
        //
        //         return template;
        //     }
        // }

        // 解决方法三：使用 StringRedisTemplate 而不是使用 RedisTemplate

        // redisTemplate.opsForValue().set("name", book.getName());
        // redisTemplate.opsForValue().set("author", book.getAuthor());
        // redisTemplate.opsForValue().set("desc", book.getDesc());

        // stringRedisTemplate.opsForValue().set("name", book.getName());
        // stringRedisTemplate.opsForValue().set("author", book.getAuthor());
        // stringRedisTemplate.opsForValue().set("desc", book.getDesc());

        return "Hello World " + name + "!!!";
    }
}
